/*
 * Copyright (C) 2010 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.zxing.camera;

import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Point;
import android.hardware.Camera;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;

import com.zxing.PreferencesActivity;

/**
 * A class which deals with reading, parsing, and setting the camera parameters
 * which are used to configure the camera hardware.
 */
final class CameraConfigurationManager {

	private static final String TAG = "CameraConfiguration";

	private final Context context;
	private Point screenResolution;
	private Point cameraResolution;
	private Point RealcameraResolution;

	CameraConfigurationManager(Context context) {
		this.context = context;
	}

	/**
	 * Reads, one time, values from the camera that are needed by the app.
	 */
	void initFromCameraParameters(Camera camera) {
		Camera.Parameters parameters = camera.getParameters();

		WindowManager manager = (WindowManager) context
				.getSystemService(Context.WINDOW_SERVICE);		
		Display display = manager.getDefaultDisplay();
		Point theScreenResolution = new Point();
		display.getSize(theScreenResolution);
		screenResolution = theScreenResolution;//x=1080；y=1920
		Log.i(TAG, "Screen resolution: " + screenResolution);
		
		
//		Point screenResolutionForCamera =new Point();    
//		screenResolutionForCamera.x = screenResolution.x;   
//		screenResolutionForCamera.y = screenResolution.y;
//		if (screenResolution.x < screenResolution.y) {      
//		screenResolutionForCamera.x = screenResolution.y;      
//		screenResolutionForCamera.y = screenResolution.x;   
//		}    // 下句第二参数要根据竖屏修改   
//		screenResolution = screenResolutionForCamera;
		
		
		cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution);
		
		Log.i(TAG, "Camera resolution: " + cameraResolution);
	}

	void setDesiredCameraParameters(Camera camera, boolean safeMode) {
		Camera.Parameters parameters = camera.getParameters();

		if (parameters == null) {
			Log.w(TAG,
					"Device error: no camera parameters are available. Proceeding without configuration.");
			return;
		}

		Log.i(TAG, "Initial camera parameters: " + parameters.flatten());

		if (safeMode) {
			Log.w(TAG,
					"In camera config safe mode -- most settings will not be honored");
		}

		//自动对焦，一直保持
		CameraConfigurationUtils.setFocus(parameters, true, true,
				safeMode);

		if (!safeMode) {
				CameraConfigurationUtils.setBarcodeSceneMode(parameters);//使用场景
				CameraConfigurationUtils.setVideoStabilization(parameters);//防抖
				CameraConfigurationUtils.setFocusArea(parameters);//对焦区域
				CameraConfigurationUtils.setMetering(parameters);//测光
		}

		// 相机设置垂直
		camera.setDisplayOrientation(90);

		parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);

		Log.i(TAG, "Final camera parameters: " + parameters.flatten());

		camera.setParameters(parameters);

		Camera.Parameters afterParameters = camera.getParameters();
		Camera.Size afterSize = afterParameters.getPreviewSize();
		if (afterSize != null
				&& (cameraResolution.x != afterSize.width || cameraResolution.y != afterSize.height)) {
			Log.w(TAG, "Camera said it supported preview size "
					+ cameraResolution.x + 'x' + cameraResolution.y
					+ ", but after setting it, preview size is "
					+ afterSize.width + 'x' + afterSize.height);
			cameraResolution.x = afterSize.width;
			cameraResolution.y = afterSize.height;
		}
	}

	Point getCameraResolution() {
		return cameraResolution;
	}

	Point getScreenResolution() {
		return screenResolution;
	}

}
